#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct namntyp{
  char namn[10];
  struct namntyp *nasta;
}namntyp;

void laes_in(namntyp **l1,char filnamn[]){
  FILE *fil;
  struct namntyp *a,*forra;
  char namn[10];

  fil=fopen(filnamn,"rt");
  *l1=NULL;
  while(!feof(fil)){
	 fscanf(fil,"%s",namn);
	 if (!feof(fil)){
		if (*l1!=NULL) forra=a;
		a=(namntyp *)malloc(sizeof(namntyp));
		a->nasta=NULL;
		strcpy(a->namn,namn);
		if (*l1==NULL)
		  *l1=a;
		else
		  forra->nasta=a;
	 }
  }
  fclose(fil);
}

void merger(namntyp *l1, namntyp *l2, namntyp *prev, char name[]){
    namntyp *temp = (namntyp*) malloc(sizeof(struct namntyp));
    char tempName[10];

    strcpy(temp->namn, name);
    prev->nasta = temp;

    if(l1==NULL && l2==NULL) return;

    if(l1 == NULL || l2 == NULL){
        if(l1 != NULL){
            strcpy(tempName, l1->namn);
            l1 = l1->nasta;
        }
        if( l2 != NULL){
            strcpy(tempName, l2->namn);
            l2 = l2->nasta;
        }
    }
    else{
        if(strcmp(l1->namn, l2->namn)<0){
            strcpy(tempName, l1->namn);
            l1 = l1->nasta;
        }
        else{
            strcpy(tempName, l2->namn);
            l2 = l2->nasta;
        }
    }

    merger(l1, l2, temp, tempName);
}

void merge(namntyp *l1,namntyp *l2,namntyp **sl){
    namntyp *temp = (namntyp*) malloc(sizeof(struct namntyp));
    *sl = temp;
    char tempName[10];

    if(strcmp(l1->namn, l2->namn)<0){
        strcpy(temp->namn, l1->namn);
        l1 = l1->nasta;
        }
    else{
        strcpy(temp->namn, l2->namn);
        l2 = l2->nasta;
        }

    if(strcmp(l1->namn, l2->namn)<0){
        strcpy(tempName, l1->namn);
        l1 = l1->nasta;
        }
    else{
        strcpy(tempName, l2->namn);
        l2 = l2->nasta;
        }

    merger(l1, l2, temp, tempName);
}


void skriv_ut(namntyp *sl){
  namntyp *a;
  while (sl!=NULL) {
	 printf("%s\n",sl->namn);
	 a=sl;
	 sl=sl->nasta;
	 free(a);
  }
}

int main(void){
  namntyp *lista1,*lista2,*slutlista;
  laes_in(&lista1,"uppg3b.dat");
  laes_in(&lista2,"uppg3d.dat");
  merge(lista1,lista2,&slutlista);
  skriv_ut(slutlista);

  return 0;
}
